package cn.zhibang.yygh2.common.util.util;

import io.jsonwebtoken.*;
import org.springframework.util.StringUtils;

import java.util.Date;

/**
 * JWTHelper工具类：
 * （1）生成token
 * （2）解析token
 */
public class JwtHelper {
    //设置token有效时间，单位毫秒
    private static final long TOKENEXPIRATION = 24*60*60*1000;
    //设置sign密钥（可以写死，也可以使用用户名等唯一属性值来做sign）
    private static final String TOKENSIGNKEY = "123456";

    /**
     * 创建 token（根据用户ID、用户名）
     * @param userId
     * @param userName
     * @return
     */
    public static String createToken(Long userId, String userName) {
        String token = Jwts.builder()  //创建JWT对象
                //必选，设置主体（声明信息），自定义名称
                .setSubject("YYGH-USER")
                //可选，设置主体信息（可以设置多个）
                .claim("userId", userId)
                .claim("userName", userName)
                //可选，设置过期时间 = 当前时间 + 有效时间
                .setExpiration(new Date(System.currentTimeMillis() + TOKENEXPIRATION))
                //设置安全密钥（生成签名所需的算法和密钥，HS512表示哈希的编码）
                .signWith(SignatureAlgorithm.HS512, TOKENSIGNKEY)
                //压缩方式(压缩解码器类型)
                .compressWith(CompressionCodecs.GZIP)
                //生成token(1.编码Header和Payload  2.生成签名  3.拼接字符串)
                .compact();
        return token;
    }

    /**
     * 获得用户ID（根据token）
     * @param token
     * @return
     */
    public static Long getUserId(String token) {
        //判断token是否为空
        if(StringUtils.isEmpty(token)) {
            return null;
        }
        //解析token
        Jws<Claims> claimsJws = Jwts.parser()   //创建解析对象
                .setSigningKey(TOKENSIGNKEY)    //设置安全密钥（生成签名所需的密钥和算法）
                .parseClaimsJws(token);         //解析token
        //获取payload私有部分内容
        Claims claims = claimsJws.getBody();
        //获取私有部分内容中的userId
        Integer userId = (Integer)claims.get("userId");
        //longValue()将Integer转换成Long类型
        return userId.longValue();
    }

    /**
     * 获得用户名username（根据token）
     * @param token
     * @return
     */
    public static String getUserName(String token) {
        //判断token是否为空
        if(StringUtils.isEmpty(token)) {
            return "";
        }
        //解析token
        Jws<Claims> claimsJws = Jwts.parser()
                .setSigningKey(TOKENSIGNKEY)
                .parseClaimsJws(token);
        //获取payload私有部分内容
        Claims claims = claimsJws.getBody();
        String userName = (String)claims.get("userName");
        return userName;
    }

    /**
     * 测试生成token和解析token
     */
    public static void main(String[] args) {
        //生成token
        String token = JwtHelper.createToken(1L, "Lucy");
        System.out.println(token);
        System.out.println(JwtHelper.getUserId(token));
        System.out.println(JwtHelper.getUserName(token));
    }
}

